/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package com.architexa.org.eclipse.gef;

import com.architexa.org.eclipse.draw2d.ConnectionAnchor;

/**
 * A specialized <code>GraphicalEditPart</code> that supports both <i>target</i> and
 * <i>source</i> <code>ConnectionEditParts</code>. This <em>optional</em> interface is
 * used by the default {@link ConnectionEditPart} implementation and supporting classes
 * to obtain the correct {@link ConnectionAnchor ConnectionAnchors} for the {@link
 * com.architexa.org.eclipse.draw2d.Connection} Figure. This interface offers a single access point for
 * obtaining ConnectionAnchors at different times. The classes which rely on this
 * interface are:
 * <UL>
 *   <LI>{@link com.architexa.org.eclipse.gef.editparts.AbstractConnectionEditPart} - during refresh(),
 *     this interface is used to obtain the appropriate ConnectionAnchors for the figure.
 *   <LI>{@link com.architexa.org.eclipse.gef.editpolicies.GraphicalNodeEditPolicy} - during creation of
 *     a new connection, there is no ConnectionEditPart. Therefore, the source node
 *     EditPart is responsible for display <i>feedback</i>.
 *   <LI>{@link com.architexa.org.eclipse.gef.editpolicies.ConnectionEndpointEditPolicy} - when
 *     disconnecting the end of a connection and reattaching it to a new node,
 *     ConnectionEndpointEditPolicy uses this interface to obtain the proper anchors for
 *     diaplaying <i>feedback</i>.
 * </UL>
 */
public interface NodeEditPart
	extends GraphicalEditPart
{

/**
 * Returns the <code>ConnectionAnchor</code> for the specified <i>source</i> connection.
 * This NodeEditPart is the {@link ConnectionEditPart#getSource() source} EditPart for the
 * given connection.
 * <P>
 * The anchor may be a function of the connection's model, the node's model, a combination
 * of both, or it may not depend on anything all.
 * @param connection the ConnectionEditPart
 * @return the ConnectionAnchor for the given ConnectionEditPart
 */
ConnectionAnchor getSourceConnectionAnchor(ConnectionEditPart connection);

/**
 * Returns the <code>ConnectionAnchor</code> for the specified <i>target</i> connection.
 * This NodeEditPart is the {@link ConnectionEditPart#getTarget() target} EditPart for the
 * given connection.
 * <P>
 * The anchor may be a function of the connection's model, the node's model, a
 * combination of both, or it may not depend on anything all.
 * @param connection the ConnectionEditPart
 * @return the ConnectionAnchor for the given ConnectionEditPart
 */
ConnectionAnchor getTargetConnectionAnchor(ConnectionEditPart connection);

/**
 * Returns the <i>source</i> <code>ConnectionAnchor</code> for the specified Request. The
 * returned ConnectionAnchor is used only when displaying <i>feedback</i>. The Request
 * is usually a {@link com.architexa.org.eclipse.gef.requests.LocationRequest}, which provides the
 * current mouse location.
 * @param request a Request describing the current interaction
 * @return the ConnectionAnchor to use during feedback
 */
ConnectionAnchor getSourceConnectionAnchor(Request request);

/**
 * Returns the <i>target</i> <code>ConnectionAnchor</code> for the specified Request. The
 * returned ConnectionAnchor is used only when displaying <i>feedback</i>. The Request
 * is usually a {@link com.architexa.org.eclipse.gef.requests.LocationRequest}, which provides the
 * current mouse location.
 * @param request a Request describing the current interaction
 * @return the ConnectionAnchor to use during feedback
 */
ConnectionAnchor getTargetConnectionAnchor(Request request);

}
